package com.zhong.tree;

/**
 * @author zhong
 * @version 1
 * @date 2022/04/09
 * @contact 1478168700@qq.com
 **/
public class TreeTest {
    public static void main(String[] args) {

        //根节点
        TreeNode root = TreeNodeBuilder.aTreeNode().withData("A").build();

        TreeNode b = TreeNodeBuilder.aTreeNode().withData("B").build();
        TreeNode c = TreeNodeBuilder.aTreeNode().withData("C").build();


        root.setLeft(b);
        root.setRight(c);

        TreeNode e = TreeNodeBuilder.aTreeNode().withData("D").build();
        TreeNode d = TreeNodeBuilder.aTreeNode().withData("E").build();

        b.setLeft(e);
        b.setRight(d);

        TreeNode f = TreeNodeBuilder.aTreeNode().withData("F").build();
        TreeNode g = TreeNodeBuilder.aTreeNode().withData("G").build();

        c.setLeft(f);
        c.setRight(g);

        preOrder(root);
        System.out.println();
        inOrder(root);
        System.out.println();
        postOrder(root);
        System.out.println();

    }

    /**
     * 先序遍历
     * <p>
     * 二叉树的先序遍历，就是先输出根结点，再遍历左子树，最后遍历右子树，遍历左子树和右子树的时候，同样遵循先序遍历的规则，也就是说，我们可以递归实现先序遍历
     *
     * @param root : 根节点
     * @return : void
     * @author : zrs
     * @date : 2022-04-09 22:56
     */
    public static void preOrder(TreeNode root) {
        if (root == null) {
            return;
        }
        //先输出root的
        System.out.print(root.getData());

        preOrder(root.getLeft());
        preOrder(root.getRight());
    }

    /**
     * 中序遍历
     * 二叉树的中序遍历，就是先递归中序遍历左子树，再输出根结点的值，再递归中序遍历右子树，大家可以想象成一巴掌把树压扁，父结点被拍到了左子节点和右子节点的中间
     *
     * @param root : 根节点
     * @return : void
     * @author : zrs
     * @date : 2022-04-09 23:00
     */
    public static void inOrder(TreeNode root) {
        if (root == null) {
            return;
        }
        inOrder(root.getLeft());
        System.out.print(root.getData());
        inOrder(root.getRight());
    }

    /**
     * 后序遍历
     * 二叉树的后序遍历，就是先递归后序遍历左子树，再递归后序遍历右子树，最后输出根结点的值
     *
     * @param root : 后序遍历
     * @return : void
     * @author : zrs
     * @date : 2022-04-09 23:01
     */
    public static void postOrder(TreeNode root) {
        if (root == null) {
            return;
        }
        postOrder(root.getLeft());
        postOrder(root.getRight());
        System.out.print(root.getData());
    }


}
